/*
 * DatosCambiarRumboAvisoJugador.cpp
 *
 *  Created on: 31/01/2010
 *      Author: San Martín, Matías I.
 */

#include "DatosCambiarRumboAvisoJugador.h"

#include "../../../Framework/Common/File.h"

namespace aplicacion {

std::ostream &operator<<( std::ostream &stream, const DatosCambiarRumboAvisoJugador &obj )
{
  return stream << "DatosCambiarRumboAvisoJugador("<< obj.getTamanio() <<"):"
			  << obj._idFlota << "|" << obj._idNuevoDestino << "|Flota...";
}

std::string DatosCambiarRumboAvisoJugador::toString() const
{
	std::stringstream stm;
	stm << *this;
	return stm.str();
}

DatosCambiarRumboAvisoJugador::DatosCambiarRumboAvisoJugador
	(framework::io::SerializableToCharArray* estadoFlota)
	: _estadoFlota(estadoFlota) {

	this->setTamanio(sizeof(t_identificadorFuente) * 2 +
							sizeof(T_ID_FLOTA) +
							_estadoFlota->getTamanio());
}

DatosCambiarRumboAvisoJugador::~DatosCambiarRumboAvisoJugador() {
	if (_estadoFlota)
		delete _estadoFlota;
}

/**
* @throws IOExcepcion @see File#writeAll
*/
size_t DatosCambiarRumboAvisoJugador::save (int fd) const
{
	size_t guardar = 0;

	//se guardan los datos especificos de esta clase
	T_ID_FLOTA id;
	t_identificadorFuente idJugador;
	t_identificadorFuente planetaDestinoNuevo;

	_idFlota.saveToMensaje(id,idJugador);
	_idNuevoDestino.saveToMensaje(planetaDestinoNuevo);

	guardar += sizeof(idJugador);
	File::writeAll(fd,&idJugador,sizeof(idJugador));

	guardar += sizeof(id);
	File::writeAll(fd,&id,sizeof(id));

	guardar += sizeof(planetaDestinoNuevo);
	File::writeAll(fd,&planetaDestinoNuevo,sizeof(planetaDestinoNuevo));

	guardar += _estadoFlota->save(fd);

	return guardar;
}

/**
 * @throws IOExcepcion @see File#writeAll
 */
size_t DatosCambiarRumboAvisoJugador::load (int fd)
{
	//se cargan los datos
	size_t cargar = 0;

	//se guardan los datos especificos de esta clase
	T_ID_FLOTA id;
	t_identificadorFuente idJugador;
	t_identificadorFuente planetaDestinoNuevo;

	cargar += sizeof(idJugador);
	File::readAll(fd,&idJugador,sizeof(idJugador));

	cargar += sizeof(id);
	File::readAll(fd,&id,sizeof(id));

	cargar += sizeof(planetaDestinoNuevo);
	File::readAll(fd,&planetaDestinoNuevo,sizeof(planetaDestinoNuevo));

	cargar += _estadoFlota->load(fd);

	_idFlota.loadFromMensaje(id,idJugador);
	_idNuevoDestino.loadFromMensaje(planetaDestinoNuevo);

	this->setTamanio(cargar);
	return cargar;
}

/**
 * @see middleware::io::SerializableToArray#saveToArray(int)
 */
size_t DatosCambiarRumboAvisoJugador::saveToArray (uint8_t* arr) const {
	uint8_t* arr_original = arr;

	//se guardan los datos especificos de esta clase
	T_ID_FLOTA id;
	t_identificadorFuente idJugador;
	t_identificadorFuente planetaDestinoNuevo;

	_idFlota.saveToMensaje(id,idJugador);
	_idNuevoDestino.saveToMensaje(planetaDestinoNuevo);

	memcpy(arr, &idJugador, sizeof(idJugador));
	arr += sizeof(idJugador);

	memcpy(arr, &id, sizeof(id));
	arr += sizeof(id);

	memcpy(arr, &planetaDestinoNuevo, sizeof(planetaDestinoNuevo));
	arr += sizeof(planetaDestinoNuevo);

	arr += _estadoFlota->saveToArray(arr);

	size_t guardar = arr - arr_original;

	return guardar;
}

/**
 * @see middleware::io::SerializableToArray#loadFromArray(int)
 */
size_t DatosCambiarRumboAvisoJugador::loadFromArray (const uint8_t* arr) {
	const uint8_t* arr_original = arr;

	//se guardan los datos especificos de esta clase
	T_ID_FLOTA id;
	t_identificadorFuente idJugador;
	t_identificadorFuente planetaDestinoNuevo;

	memcpy(&idJugador, arr, sizeof(idJugador));
	arr += sizeof(idJugador);

	memcpy(&id, arr, sizeof(id));
	arr += sizeof(id);

	memcpy(&planetaDestinoNuevo, arr, sizeof(planetaDestinoNuevo));
	arr += sizeof(planetaDestinoNuevo);

	arr += _estadoFlota->loadFromArray(arr);

	_idFlota.loadFromMensaje(id,idJugador);
	_idNuevoDestino.loadFromMensaje(planetaDestinoNuevo);

	size_t cargar = arr - arr_original;

	this->setTamanio(cargar);
	return cargar;
}

}//namespace aplicacion
